/**
 * author:Administrator
 * date:2016/2/25
 * desc:
 * 优惠券申请规则: 规定截止日期,限制总数量
 * 优惠券使用规则: 规定截止日期,满xx元 就减免 xx元,限定范围:某个商家的某个商品
 */

'use strict';

let Repo = require('./CouponRepo.js');
let FormatDate = require('../../../infrastructure/appUtil/FormatDate.js');
let DomainModel = require('../../../lib/DomainModel.js');
let events = require('../../saga/domainEvent.js');

let COUPON_CONST = {
  unlimit_count: -1,
  unlimit_date: -1,
  unlimit_vendor: -1,
  unlimit_ware: -1,
  unlimit_consume: 0, //不限消费额度
};

/**
 * mjs = 满就送
 */
class CouponMjs extends DomainModel {
  constructor(pojo) {
    super();
  }

  /**
   * 新建 一个当前对象的实例
   * @param pojo, key:
   */
  static freshNew(pojo) {
    let item = new CouponMjs();
    item.applyDeadline = pojo.applyDeadline || COUPON_CONST.unlimit_date;   // 申请截止日期
    item.useDeadline = pojo.useDeadline || COUPON_CONST.unlimit_date;       // 使用截止日期
    item.maxCount = pojo.maxCount || COUPON_CONST.unlimit_count;            // 最多发行张数
    item.remain = item.maxCount;                                            // 剩余张数
    item.consumeLimit = pojo.consumeLimit || COUPON_CONST.unlimit_consume;  // 最低消费
    item.money = pojo.money;                                                // 减免金额
    item.limitVendorId = pojo.limitVendorId || COUPON_CONST.unlimit_vendor; // 限定商家
    item.limitWareId = pojo.limitWareId || COUPON_CONST.unlimit_ware;       // 限定商品
    item.createdAt = FormatDate.unixTimestamp();
    return item;
  }

  /**
   * 从数据库中读取，re-constructor an obj
   * @param pojo
   */
  static rebuild(pojo) {
    let item = new CouponMjs();
    let keys = Object.keys(pojo);
    for (let key of keys) {
      item[key] = pojo[key];
    }
    return item;
  }


  /**
   * 使用条件 检测
   */
  checkUseLimit(order) {
    // 日期检测
    let dateCheck = this.useDeadline == COUPON_CONST.unlimit_date
      || (FormatDate.unixTimestamp() < this.useDeadline);
    if (!dateCheck) return false;

    // 最低消费额
    if (order.money < this.consumeLimit) {
      return false;
    }

    // 限定商家
    if (this.limitVendorId == COUPON_CONST.unlimit_vendor) {
      // 不限商家，则不限商品
      return true;
    }
    if (order.vendorId != this.limitVendorId) {
      return false;
    }

    // 商品检测
    let wareCheck = this.limitWareId == COUPON_CONST.unlimit_ware
      || (this.limitWareId == order.wareId);
    return wareCheck;
  }

  /**
   * 申请条件 检测
   */
  checkApplyLimit(count) {
    count = count || 1;
    // 日期检测
    let dateCheck = this.applyDeadline == COUPON_CONST.unlimit_date
      || (FormatDate.unixTimestamp() < this.applyDeadline);
    if (!dateCheck) return false;

    // 剩余数量检测
    let remainCheck = this.maxCount == COUPON_CONST.unlimit_count
      || (this.remain >= count);
    if (!remainCheck) return false;
    return true;
  }

  /**
   * 为 couponcustomer 预留
   * @param couponLog
   * @return true,false
   */
  * reserve(couponLog, sagaId) {
    let isOk = yield Repo.decrease(this.id, 1);
    if (isOk) {
      this.pubDomainEvent(new events.CouponReserved(sagaId, couponLog));
    } else {
      this.pubDomainEvent(new events.CouponLacking(sagaId, couponLog));
    }
  }

  * addStock(count) {
    this.quantity += count;
    yield this.store();
    return true;
  }

  /**
   * 用户 申请优惠券
   * @params count 数量
   * @params t transction
   * @returns {boolean}
   */
  * customerApply(count, t) {
    if (!this.checkApplyLimit(count)) return false;
    return yield Repo.decrease(this.id, count, t);
  }

  * store(t) {
    yield Repo.store(this, t);
  }
}
CouponMjs.COUPON_CONST = COUPON_CONST;
module.exports = CouponMjs;